home *** CD-ROM | disk | FTP | other *** search
Text File | 1990-10-15 | 20.7 KB | 1,016 lines |
- page ,132
- ;-----------------------------Module-Header-----------------------------;
- ; Module Name: MACROS.MAC
- ;
- ; This file contains macros definitions for all display drivers to use.
- ;
- ; Created: 06-Jan-1987
- ; Author: Walt Moore [waltm]
- ;
- ; Copyright (c) 1987 Microsoft Corporation
- ;
- ; Exported Functions: none
- ;
- ; Public Functions: none
- ;
- ; Public Data: none
- ;
- ; General Description:
- ;
- ; Two text equates are given as short hand for WORD PTR
- ; and BYTE PTR.
- ;
- ; A Macro is defined for performing 16-bit output on machines
- ; which cannot correctly do so.
- ;
- ; The macro which is invoked by CMACROS for private stack
- ; checking is defined.
- ;
- ; Restrictions:
- ; The use of the ?CHKSTKPROC macro requires it to be defined
- ; before CMACROS is included. If CMACROS is included before
- ; the include file, a ?CHKSTKPROC macro should be defined
- ; with a null macro body. This macro will then redefine the
- ; earlier macro.
- ;
- ; The out16 macro is intended as documentation for anyone
- ; converting a driver to a machine which cannot do 16-bit
- ; outputs correctly. There is no guarantee that any code
- ; will have been tested (only one machine is known to have
- ; the problem).
- ;
- ;-----------------------------------------------------------------------;
-
-
-
-
- ; The following two equates are just used as shorthand
- ; for the "word ptr" and "byte ptr" overrides.
-
- fptr equ fword ptr
- wptr equ word ptr
- bptr equ byte ptr
-
- ; The following structure should be used to access high and low
- ; words of a DWORD. This means that "word ptr foo[2]" -> "foo.hi".
-
- LONG struc
- lo dw ?
- hi dw ?
- LONG ends
-
- FARPOINTER struc
- off dw ?
- sel dw ?
- FARPOINTER ends
-
- FPOINTER struc
- foff dd ?
- fsel dw ?
- FPOINTER ends
-
- ;---------------------------------Macro---------------------------------;
- ; out16
- ;
- ; out16 is a macro used wherever any 16-bit output is performed.
- ; The macro is intended to serve as documentation for those machines
- ; which do not perform 16-bit outputs correctly (where correctly is
- ; defined as the way the IBM AT does it).
- ;
- ; usage
- ;
- ; out16 d,a
- ;
- ; where
- ;
- ; d - I/O address register. Included as documentation
- ; only. Must always be DX (lower case).
- ;
- ; a - Register to output. Included as documentation
- ; only. Must always be AX (lower case).
- ;
- ; Entry:
- ; AX = data to output
- ; DX = I/O port address
- ; Returns:
- ; none
- ; Error Returns:
- ; none
- ; Registers Destroyed:
- ; FLAGS
- ; Registers Preserved:
- ; AX,BX,CX,DX,SI,DI,BP,DS,ES
- ; Calls:
- ; none
- ; History:
- ; Fri 16-Jan-1987 16:49:03 -by- Walt Moore [waltm]
- ; Initial version
- ;-----------------------------------------------------------------------;
-
-
- ifndef IO8 ;;If normal 16 bit outputs
- out16 equ out
- else ;;If 8-bit outputs
- out16 macro d,a
- ifdif <a>,<ax>
- %out out16 - invalid register, must be ax
- .err
- endif
- ifdif <d>,<dx>
- %out out16 - invalid register, must be dx
- .err
- endif
- ifdif <is>,<cli> ;; If interrupts not off
- cli ;; then turn them off
- endif ;;
- out dx,al ;; Output LSB portion
- inc dx ;; --> next address
- xchg al,ah ;; Get MSB of output value
- out dx,al ;; Output MSB portion
- ifdif <ie>,<cli> ;; If not explicitly told to leave
- sti ;; interrupts off, turn them on
- endif ;;
- ifdif <rd>,<dont_save_DL> ;; If not explicitly told to trash DX,
- dec dx ;; restore it.
- xchg al,ah
- endif
- endm
- endif
-
-
-
- ;---------------------------------Macro---------------------------------;
- ; ?CHKSTKPROC
- ;
- ; Private Stack Checking Macro
- ;
- ; ?CHKSTKPROC will be invoked by the CMACROS for any procedure
- ; with local variables if both ?CHKSTK and ?CHKSTKPROC were
- ; defined prior to including the CMACROS.
- ;
- ; The macro has one parameter, which is the number of bytes
- ; to allocate, which is supplied by the CMACROS.
- ;
- ; The usage of this macro is defined by the CMACROS. There is no
- ; user control over the macro. Register usage will be as defined
- ; by the routine my_check_stack.
- ;
- ; Calls:
- ; my_check_stack
- ; History:
- ; Fri 16-Jan-1987 16:49:03 -by- Walt Moore [waltm]
- ; Initial version
- ;-----------------------------------------------------------------------;
-
-
- ifdef ?CHKSTK ;;Only define macro if
- ifdef ?CHKSTKPROC ;; private stack checking
- ifndef ?CHKSTKNAME ;;If user name differs from default
- extrn my_check_stack:near ;;Procedure to do the checking
- endif
- ?CHKSTKPROC macro s ;;Actual macro text
- mov ax,s ;;my_check_stack takes requested space
- ifdef ?CHKSTKNAME
- ?CHKSTKNAME
- else
- call my_check_stack ;; in AX
- endif
- endm
- endif
- endif
-
-
-
- ;-----------------------------------------------------------------------;
- ; odd --- macro for odd alignment, counterpart for masm's "even".
- ;
- ; Arguments:
- ; none
- ; Returns:
- ; nothing
- ; Alters:
- ; nothing
- ; Calls:
- ; nothing
- ; History:
- ;
- ; Sun Mar 01, 1987 07:48:01p -by- Wesley O. Rupel [wesleyr]
- ; Wrote it!
- ;-----------------------------------------------------------------------;
-
-
- odd macro
- ife (offset $) AND 1
- nop
- endif
- endm
-
-
-
- ;-----------------------------------------------------------------------;
- ; pushem
- ; popem
- ;
- ; Allows giving a list of registers to push/pop on a single line.
- ; Also allows easy verificaton that pushes and pops are balanced
- ; because arguements are given in the same order:
- ;
- ; pushem ax,bx,cx goes with
- ; popem ax,bx,cx
- ;
- ; Arguments:
- ; registers to push/pop
- ; Returns:
- ; nothing
- ; Alters:
- ; nothing
- ; Calls:
- ; nothing
- ; History:
- ;
- ; Mon Mar 09, 1987 06:12:32p -by- Wesley O. Rupel [wesleyr]
- ; Wrote it!
- ;-----------------------------------------------------------------------;
-
-
- pushem macro r1,r2,r3,r4,r5,r6,r7,r8,r9,rA,rB,rC,rD,rE,rF,r10,r11,r12
- irp x,<r1,r2,r3,r4,r5,r6,r7,r8,r9,rA,rB,rC,rD,rE,rF,r10,r11,r12>
- ifnb <x>
- push x
- endif
- endm
- endm
-
- popem macro r1,r2,r3,r4,r5,r6,r7,r8,r9,rA,rB,rC,rD,rE,rF,r10,r11,r12
- irp x,<r12,r11,r10,rF,rE,rD,rC,rB,rA,r9,r8,r7,r6,r5,r4,r3,r2,r1>
- ifnb <x>
- pop x
- endif
- endm
- endm
-
-
-
- ;-----------------------------------------------------------------------;
- ; smov
- ;
- ; smove moves the contents of one segment register into another
- ; segment register.
- ;
- ; usage
- ;
- ; smov x,y
- ;
- ; where
- ;
- ; x is the destination register
- ; y is the source register
- ;
- ; Arguments:
- ; y is source segment register
- ; Returns:
- ; x segment register = y segment register
- ; Alters:
- ; x segment register
- ; Calls:
- ; nothing
- ; History:
- ;
- ; Mon Mar 09, 1987 06:12:32p -by- Wesley O. Rupel [wesleyr]
- ; Wrote it!
- ;-----------------------------------------------------------------------;
-
-
- smov macro x,y
- push y
- pop x
- endm
-
-
- ;-----------------------------------------------------------------------;
- ; jmps - jump short
- ;
- ; does a shourt jump, (stupid masm!)
- ;
- ; usage
- ; jmps label ==> jmp short label
- ;
- ; where
- ; label is the destination label
- ;
- ;-----------------------------------------------------------------------;
-
- jmps macro there
- jmp short there
- endm
-
-
- ;--------------------------------------------------------------------------;
- ; abs_ax
- ; takes absolute value of AX
- ; Entry:
- ; AX = integer
- ; Returns:
- ; AX = abs(AX)
- ; Error Returns:
- ; none
- ; Registers Destroyed:
- ; DX,FLAGS
- ; Registers Preserved:
- ; BX,CX,SI,DI,DS,ES,BP
- ; Calls:
- ; none
- ; History:
- ; Thu Mar 05, 1987 06:15:46p -by- Tony Pisculli [tonyp]
- ; wrote it
- ;--------------------------------------------------------------------------;
-
-
- abs_ax macro
- cwd
- xor ax,dx
- sub ax,dx
- endm
-
-
-
- ;--------------------------------------------------------------------------;
- ; min_ax
- ; returns min of AX and REG
- ; Entry:
- ; AX = integer
- ; REG = general purpose register containing an integer
- ; Returns:
- ; AX = min(AX,REG)
- ; Error Returns:
- ; none
- ; Registers Destroyed:
- ; DX,FLAGS
- ; Registers Preserved:
- ; BX,CX,SI,DI,DS,ES,BP
- ; Calls:
- ; none
- ; History:
- ; Sat Mar 07, 1987 08:39:04p -by- Tony Pisculli [tonyp]
- ; wrote it
- ;--------------------------------------------------------------------------;
-
-
- min_ax macro REG
- ifdif <REG>,<0>
- sub ax,REG
- endif
- cwd
- and ax,dx
- ifdif <REG>,<0>
- add ax,REG
- endif
- endm
-
-
-
- ;--------------------------------------------------------------------------;
- ; max_ax
- ; returns max of AX and REG
- ; Entry:
- ; AX = integer
- ; REG = general purpose register containing an integer
- ; Returns:
- ; AX = max(AX, REG)
- ; Error Returns:
- ; none
- ; Registers Destroyed:
- ; DX,FLAGS
- ; Registers Preserved:
- ; BX,CX,SI,DI,DS,ES,BP
- ; Calls:
- ; none
- ; History:
- ; Sat Mar 07, 1987 08:41:38p -by- Tony Pisculli [tonyp]
- ; wrote it
- ;--------------------------------------------------------------------------;
-
-
- max_ax macro REG
- ifdif <REG>,<0>
- sub ax,REG
- endif
- cwd
- not dx
- and ax,dx
- ifdif <REG>,<0>
- add ax,REG
- endif
- endm
-
-
-
- ; The following equates are used for defining the target
- ; processor to the shift macros.
-
-
- GENERIC equ 0
-
- CPU equ GENERIC
- ;CPU equ 88
- ;CPU equ 86
- ;CPU equ 186
- ;CPU equ 286
- ;CPU equ 386
-
-
-
- ;--------------------------------------------------------------------------;
- ; shiftl
- ;
- ; shiftl is used to implement the advanced shift left immediate
- ; (SHL dest,count) functionality of the 286 and 386.
- ;
- ; Entry:
- ; DEST = var to shift
- ; COUNT = number to shift by
- ; Returns:
- ; DEST = DEST shl COUNT
- ; Error Returns:
- ; none
- ; Registers Destroyed:
- ; none
- ; Registers Preserved:
- ; all
- ; Calls:
- ; none
- ; History:
- ; Sat Mar 07, 1987 08:44:30p -by- Tony Pisculli [tonyp]
- ; wrote it
- ;--------------------------------------------------------------------------;
-
-
- shiftl macro DEST,COUNT
- if (CPU eq 286) or (CPU eq 386)
- shl DEST,COUNT
- else
- REPT COUNT
- shl DEST,1
- ENDM
- endif
- endm
-
-
-
- ;--------------------------------------------------------------------------;
- ; shiftr
- ;
- ; shiftr is used to implement the advanced shift right immediate
- ; (SHR dest,count) functionality of the 286 and 386.
- ;
- ; Entry:
- ; DEST = var to shift
- ; COUNT = number to shift by
- ; Returns:
- ; DEST = DEST shr COUNT
- ; Error Returns:
- ; none
- ; Registers Destroyed:
- ; none
- ; Registers Preserved:
- ; all
- ; Calls:
- ; none
- ; History:
- ; Sat Mar 07, 1987 08:44:52p -by- Tony Pisculli [tonyp]
- ; wrote it
- ;--------------------------------------------------------------------------;
-
-
- shiftr macro DEST,COUNT
- if (CPU eq 286) or (CPU eq 386)
- shr DEST,COUNT
- else
- REPT COUNT
- shr DEST,1
- ENDM
- endif
- endm
-
-
- ;--------------------------------------------------------------------------;
- ; rotcr, rotcl
- ; rotr, rotl
- ;
- ; Use just like you would rcr (or rcl, rol, ror) immediate in 286 specific
- ; code. If the processor does not support the immediate count (>1 on 808[68])
- ; then the macro generates multiple rcr (...) by one statements.
- ;
- ; Entry:
- ; DEST = var to rotate
- ; COUNT = number to rotate by
- ; Returns:
- ; DEST = DEST shr COUNT
- ; Error Returns:
- ; none
- ; Registers Destroyed:
- ; none
- ; Registers Preserved:
- ; all
- ; Calls:
- ; none
- ; History:
- ;
- ; Fri Apr 17, 1987 08:39:39p -by- Wesley O. Rupel [wesleyr]
- ; added rotl and rotr
- ;
- ; Sun Apr 12, 1987 07:34:37p -by- Wesley O. Rupel [wesleyr]
- ; wrote it
- ;--------------------------------------------------------------------------;
-
-
- rotcr macro DEST,COUNT
- if (CPU eq 286) or (CPU eq 386)
- rcr DEST,COUNT
- else
- REPT COUNT
- rcr DEST,1
- ENDM
- endif
- endm
-
- rotcl macro DEST,COUNT
- if (CPU eq 286) or (CPU eq 386)
- rcl DEST,COUNT
- else
- REPT COUNT
- rcl DEST,1
- ENDM
- endif
- endm
-
-
-
- rotl macro DEST,COUNT
- if (CPU eq 286) or (CPU eq 386)
- rol DEST,COUNT
- else
- REPT COUNT
- rol DEST,1
- ENDM
- endif
- endm
-
-
- rotr macro DEST,COUNT
- if (CPU eq 286) or (CPU eq 386)
- ror DEST,COUNT
- else
- REPT COUNT
- ror DEST,1
- ENDM
- endif
- endm
-
-
- ;--------------------------------------------------------------------------;
- ; ashiftr
- ;
- ; ashiftr is used to implement the advanced shift arithmetic right immediate
- ; (SAR dest,count) functionality of the 286 and 386.
- ;
- ; Entry:
- ; DEST = var to shift
- ; COUNT = number to shift by
- ; Returns:
- ; DEST = DEST sar COUNT
- ; Error Returns:
- ; none
- ; Registers Destroyed:
- ; none
- ; Registers Preserved:
- ; all
- ; Calls:
- ; none
- ; History:
- ; Sat Mar 07, 1987 08:45:06p -by- Tony Pisculli [tonyp]
- ; wrote it
- ;--------------------------------------------------------------------------;
-
-
- ashiftr macro DEST,COUNT
- if (CPU eq 286) or (CPU eq 386)
- sar DEST,COUNT
- else
- REPT COUNT
- sar DEST,1
- ENDM
- endif
- endm
-
-
-
- ;---------------------------------Macro---------------------------------;
- ; jmpnext
- ; jmpnext stop
- ;
- ; jmpnext is used in the generation of fall through chains. It
- ; generates the opcode used to swallow the next two bytes of object
- ; code (cmp ax,immediate word), and performs error checking to
- ; ensure that only two bytes of object code exist between any
- ; use of jmpnext.
- ;
- ; The chain is terminated by use of an optional parameter to jmpnext.
- ; If this optional field is non-blank, the chain is terminated.
- ;
- ; usage
- ;
- ; dog:
- ; mov al,34
- ; jmpnext
- ;
- ; foo:
- ; mov al,0
- ; jmpnext
- ;
- ; bar:
- ; mov al,1
- ; jmpnext stop ;End of the chain
- ;
- ; Entry:
- ; none
- ; Returns:
- ; none
- ; Error Returns:
- ; none
- ; Registers Destroyed:
- ; FLAGS
- ; Registers Preserved:
- ; AX,BX,CX,DX,SI,DI,BP,DS,ES
- ; Calls:
- ; none
- ; History:
- ; Fri 13-Mar-1987 12:03:16 -by- Walt Moore [waltm]
- ; Initial version
- ;-----------------------------------------------------------------------;
-
-
- ??ji = 0 ;;Initial index value
-
- jmpnext macro e
- jn %??ji,%(??ji+1),e ;;Set next label
- endm
-
- jn macro i,j,e
- .sall
- ??ji&i:
- .xall
- ifb <e> ;;If not the end of the chain
- db 03Dh ;;cmp ax, next two bytes
- errn$ ??ji&j,+2 ;;next lable must be two bytes away
- endif
- ??ji=j ;;increment counter
- endm
-
-
-
- ;---------------------------------Macro---------------------------------;
- ; missing_code
- ;
- ; missing_code is a macro which will display a message on the screen
- ; at assembly time. It is used to flag code sequences which have not
- ; been completed.
- ;
- ; usage
- ;
- ; missing_code <text>
- ;
- ; Entry:
- ; none
- ; Returns:
- ; none
- ; Error Returns:
- ; none
- ; Registers Destroyed:
- ; none
- ; Registers Preserved:
- ; ALL
- ; Calls:
- ; none
- ; History:
- ; Sun 22-Mar-1987 18:21:34 -by- Walt Moore [waltm]
- ; Initial version
- ;-----------------------------------------------------------------------;
-
- missing_code macro x
- if1
- ??_out <&! Missing Code &! x>
- endif
- endm
-
- ;---------------------------Macro---------------------------------------;
- ; LMHtoP
- ;
- ; Converts a Local Memory Handle to a local pointer.
- ;
- ; Entry:
- ; reg1[,reg2]
- ; Returns:
- ; reg1 = pointer
- ; Error Returns:
- ;
- ; Registers Destroyed:
- ; none
- ; History:
- ; Mon Mar 23, 1987 06:54:26a -by- Charles Whitmer [chuckwh]
- ; Imported from GDI.
- ;-----------------------------------------------------------------------;
-
- LMHtoP macro r1,r2 ;; Local Movable Handle to pointer
- ifnb <r2>
- mov r1,[r2]
- else
- mov r1,[r1]
- endif
- endm
-
-
- ;-------------------------Macro-----------------------------------------;
- ; WriteAux
- ;
- ; Writes some debugging info to the standard aux device.
- ;
- ; Entry:
- ; none
- ; Returns:
- ; none - string was output to aux
- ; History:
- ; Wed Apr-05-1981 -by- Gary Maltzen, Preferred Solutions, Inc.
- ; Changed to use TRACER.
- ;
- ; Mon Jan-30-1989 -by- David Miller, Video Seven Inc.
- ; Wrote it.
- ;
- ;-----------------------------------------------------------------------;
-
- ifdef DEBUG
-
- extrn tracer : far
-
- WriteAux macro text
- local over
- call tracer
- jmp short over
- db "&text&",13,10
- over label near
- endm
-
- else; DEBUG
-
- WriteAux macro
- endm
-
- endif; DEBUG
-
- ;WriteAux macro dstr
- ; local WriteAuxStr,WriteAuxStrLen
- ;
- ;ifdef DEBUG
- ;
- ; jmp @F
- ;
- ;WriteAuxStr db dstr,10,13
- ;WriteAuxStrLen equ $-WriteAuxStr
- ;
- ;@@:
- ; push ax
- ; push bx
- ; push cx
- ; push dx
- ; push ds
- ;
- ; mov ax,cs ;Get segment of string into ds
- ; mov ds,ax
- ; lea dx,WriteAuxStr
- ; mov cx,WriteAuxStrLen
- ; mov bx,0003h ;standard aux device
- ; mov ah,040h ;Write String
- ; int 21h
- ;
- ; pop ds
- ; pop dx
- ; pop cx
- ; pop bx
- ; pop ax
- ;endif
- ; endm
-
- ;-------------------------Macro-----------------------------------------;
- ; ?_pub
- ;
- ; Conditionally generates debugging public symbol if PUBDEFS is defined.
- ;
- ; Entry:
- ;
- ; Returns:
- ;
- ; History:
- ; Mon 13-Feb-1989 -by- Gary Maltzen.
- ; Wrote it.
- ;
- ;-----------------------------------------------------------------------;
-
- ?_pub macro name
- ifdef PUBDEFS
- public name
- endif
- endm
-
- ;-------------------------Macro-----------------------------------------;
- ; REPSTOSB Dst
- ;
- ; store <cx> copies of al at Dst, aliging destination on WORD writes
- ;
- ; Dst destination, must be of the form SEL:[di] (default is es:[di])
- ;
- ; Entry:
- ; Dst -> points to dest buffer
- ; al byte to write
- ; cx count bytes
- ;
- ; NOTE a dest segment other than ES is handled by generating a loop
- ; all other cases generate a rep mov
- ;
- ; NOTE this code assumes the direction flag is set to FORWARD
- ;
- ; Returns:
- ;
- ; History:
- ; Sun 31-Jul-1989 -by- ToddLa
- ; Wrote it.
- ;
- ;-----------------------------------------------------------------------;
-
- ?REPSTOSB macro Dst
- local l1
- local l2
- local l3
-
- mov ah,al ; make sure ah == al
- fesdi = 0
-
- ifidni <Dst>,<es:[di]>
- fesdi = 1
- endif
-
- ifidni <Dst>,<es:[edi]>
- fesdi = 1
- endif
-
- if fesdi
- ;
- ; This is the easy case, we can use stos
- ;
- test di,1
- jz l1
- stos byte ptr Dst
- dec cx
- l1:
- shr cx,1
- rep stos word ptr Dst
- adc cl,cl
- rep stos byte ptr Dst
- else
- ;
- ; This is the hard case, stos cant take a override, fake it
- ;
- test di,1
- jz l1
- mov byte ptr Dst,al
- inc di
- dec cx
- l1: jcxz l3
- shr cx,1
- pushf
- l2: mov word ptr Dst,ax
- inc di
- inc di
- loop l2
-
- popf
- jnc l3
- mov byte ptr Dst,al
- inc di
- l3:
- endif
- endm
-
- REPSTOSB macro Dst
- ifb <Dst>
- ?REPSTOSB es:[di]
- else
- ?REPSTOSB Dst
- endif
- endm
-
- ;-------------------------Macro-----------------------------------------;
- ; REPMOVSB Dst, Src, alignR
- ;
- ; copy <cx> bytes from Src to Dst, aliging destination or source
- ; on WORD writes
- ;
- ; Dst destination, must be of the form SEL:[di] (default is es:[di])
- ; Src source, must be of the form SEL:[si] (default is ds:[si])
- ; alignR register to align si or di (default is di)
- ;
- ; Entry:
- ; Src -> points to source buffer
- ; Dst -> points to dest buffer
- ; cx count bytes
- ;
- ; NOTE a dest segment other than ES is handled by generating a loop
- ; all other cases generate a rep mov
- ;
- ; NOTE this code assumes the direction flag is set to FORWARD
- ;
- ; Returns:
- ;
- ; History:
- ; Sun 31-Jul-1989 -by- ToddLa
- ; Wrote it.
- ;
- ;-----------------------------------------------------------------------;
-
- ?REPMOVSB macro Dst, Src, alignR
- local l1
- local l2
- local l3
-
- fesdi = 0
-
- ifidni <Dst>,<es:[di]>
- fesdi = 1
- endif
-
- ifidni <Dst>,<es:[edi]>
- fesdi = 1
- endif
-
- if fesdi
- ;
- ; Destination segment register is ES we can use MOVS
- ;
- test alignR,1
- jz l1
- movs byte ptr Dst, byte ptr Src
- dec cx
- l1: shr cx,1
- rep movs word ptr Dst, word ptr Src
- adc cl,cl
- rep movs byte ptr Dst, byte ptr Src
- else
- ;
- ; Destination segment register is not ES!
- ; generate code that does the same thing
- ;
- push ax
-
- test alignR,1
- jz l1
- lods byte ptr Src
- mov byte ptr Dst,al
- inc di
- dec cx
- l1: jcxz l3
- shr cx,1
- pushf
- l2: lods word ptr Src
- mov word ptr Dst,ax
- inc di
- inc di
- loop l2
- popf
- jnc l3
- lods byte ptr Src
- mov byte ptr Dst,al
- inc di
- l3:
- pop ax
- endif
- endm
-
- REPMOVSB macro Dst, Src, alignR
-
- ifb <Dst>
- ?REPMOVSB es:[di],ds:[si],di
- exitm
- endif
-
- ifb <Src>
- ?REPMOVSB Dst,ds:[si],di
- exitm
- endif
-
- ifb <alignR>
- ?REPMOVSB Dst,Src,di
- exitm
- endif
- ?REPMOVSB Dst,Src,alignR
-
- endm
-